RCT 盲目の窓

概要

ICTSC は今年から Astro(以下ブログ)を用いてブログを構築することにした。リバースプロキシサーバとして Nginx を利用している。
なぜか Nginx 経由で繋がらないどころか blog.example.jp でアクセスできるようにしようとしシンボリックリンクを貼ったところ起動しなくなった。リバースプロキシ経由で繋がるようにしてほしい。

前提条件

  • systemd にてブログは管理している。サービス名は blog.service である。
  • /etc/nginx/ 以下においてファイルの変更は不可だが以下の2つのファイルだけは例外である。
    • /etc/nginx/sites-available/blog.example.jp ファイルの編集は可能。
    • sites-availabled/blog.example.jp から sites-enabled/blog.example.jp へのシンボリックリンク以外を禁止とする。(sites-enabled/blog.example.jp のリンク解除およびファイル削除は許可する)

初期状態

  • bastion から $ curl -H 'Host:blog.example.jp' 192.168.255.9 をしても応答がない。
  • ブログは 8080 ポートで起動しているので curl 192.168.255.9:8080 で踏み台サーバから直接ブログへはアクセスできる。

終了状態

  • bastionから $ curl -H 'Host:blog.example.jp' 192.168.255.9 をするとステータスコード200のレスポンスが返ってくる。
  • sites-availabled から sites-enabled へのシンボリックリンクを貼っている。
  • 再起動しても blog と nginx が正しく自動起動する。

解説

Astro を用いているが特にこの技術に関しての問題ではなく。シンボリックリンクの貼り間違えと、バインドする IP を間違っていただけである。

Nginx が起動しない問題は以下で確認することができる。

$ sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Tue 2023-02-14 19:06:38 JST; 1min 2s ago
       Docs: man:nginx(8)
    Process: 299 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)

Feb 14 19:06:38 blog-server systemd[1]: Starting A high performance web server and a reverse proxy server...
Feb 14 19:06:38 blog-server nginx[299]: nginx: [emerg] open() "/etc/nginx/sites-enabled/blog.example.jp" failed (40: Too many lev> ←ここが原因
Feb 14 19:06:38 blog-server nginx[299]: nginx: configuration file /etc/nginx/nginx.conf test failed
Feb 14 19:06:38 blog-server systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
Feb 14 19:06:38 blog-server systemd[1]: nginx.service: Failed with result 'exit-code'.
Feb 14 19:06:38 blog-server systemd[1]: Failed to start A high performance web server and a reverse proxy server.

開けないのはシンボリックリンクをミスっている(循環参照)からである

sudo ln -s ./blog.example.jp ../sites-enabled/.

修正するにはシンボリックリンクを正しく絶対パスで貼る

sudo unlink /etc/nginx/sites-enabled/blog.example.jp
sudo ln -s /etc/nginx/sites-available/blog.example.jp /etc/nginx/sites-enabled/blog.example.jp

しかしまだアクセスできない。

踏み台側
curl -H 'Host:blog.example.jp' 192.168.255.9

自分側
curl localhost:8080

blog.service を確認するとバインドする IP が間違っているためアクセスできなかったので修正

vim /etc/systemd/system/blog.service

[Unit]
Description=Blog
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/user/ictsc-blog
ExecStart=npm run start -- --port 8080 --host 192.168.255.9 ← --host を消すか 0.0.0.0 にバインドする
ExecStop=/bin/kill -WINCH ${MAINPID}
Restart=always

[Install]
WantedBy=multi-user.target

反映させることで踏み台側からアクセスできるようになる

sudo systemd daemon-reload
sudo systemd restart blog
curl -H 'Host:blog.example.jp' 192.168.255.9

また、blog.service を変更せずに Nginx のプロキシ元を 192.168.255.9::8080 にしている場合でも正解としている。

採点基準

  • 原因特定できている 25%
  • 前提条件と終了条件を満たせている 75%